Using TabPy for Advanced Analytics – Complete Detailed Notes
Topic: Using TabPy for Advanced Analytics
Objective: Learn how to integrate Tableau with Python through TabPy, perform advanced statistical calculations, build predictive models, deploy reusable analytical functions, and display analytical results in interactive Tableau dashboards.
Course Link: Explore Tableau Training
Course Demo: Register for a Tableau Course Demo
1. Introduction to TabPy
TabPy stands for Tableau Python Server. It is an open-source analytics extension that enables Tableau to execute Python scripts and call deployed Python functions. It extends Tableau's analytical capabilities by allowing Python calculations to be used alongside interactive visualizations.
Tableau provides tools for data exploration, reporting, and visualization. Python provides libraries for statistical analysis, machine learning, data processing, and mathematical computation. TabPy connects these capabilities so that Tableau can send data to Python and receive calculated results.
Official documentation: TabPy Official Documentation.
Why Use TabPy?
- Perform advanced statistical calculations.
- Apply machine learning models to business data.
- Calculate predictions and risk scores.
- Perform customer segmentation and clustering.
- Detect anomalies and unusual patterns.
- Use Python libraries such as NumPy, pandas, and scikit-learn.
- Deploy reusable analytical functions for multiple workbooks.
- Display Python-generated results in Tableau worksheets and dashboards.
Example
A retail organization wants to estimate future sales using historical sales, advertising expenditure, and customer demand. A Python model can generate predictions through TabPy, and Tableau can display actual versus predicted sales with filters for region, category, and date.
2. Understanding Advanced Analytics
Advanced analytics involves applying statistical techniques, mathematical models, and machine learning methods to discover patterns, explain outcomes, and predict future events.
| Type |
Purpose |
Example |
| Descriptive analytics |
Explains what happened. |
Monthly sales reports. |
| Diagnostic analytics |
Investigates why something happened. |
Analyzing the reasons for a sales decline. |
| Predictive analytics |
Estimates what may happen next. |
Forecasting future sales. |
| Prescriptive analytics |
Evaluates possible actions. |
Recommending inventory levels. |
TabPy is especially useful when the required analytical method is not conveniently available through Tableau's built-in calculations or supported native analytics features.
3. TabPy Architecture
TabPy works as an external analytics service. Tableau sends a calculation request and the necessary input data to TabPy. Python executes the request, and the result is returned to Tableau for visualization.
Architecture Diagram
Business Data
|
v
Tableau Data Source
|
v
Tableau Worksheet / Dashboard
|
| Python calculation request
v
TabPy Analytics Extension
|
v
Python Code and Libraries
(NumPy, pandas, scikit-learn)
|
| Calculation results
v
Tableau Visualization
Main Components
| Component |
Description |
| Tableau |
Creates worksheets, dashboards, filters, and visualizations. |
| TabPy server |
Receives requests and executes Python calculations. |
| Python runtime |
Runs the Python code and analytical models. |
| Python libraries |
Provide statistical, numerical, and machine learning functions. |
| Deployed endpoint |
Makes a reusable Python function available through TabPy. |
TabPy supports both executing Python code through Tableau calculations and invoking deployed functions that can be reused across analytical workflows.
4. Prerequisites for Using TabPy
Prepare the following components before starting a TabPy project.
- Tableau Desktop or a compatible Tableau deployment.
- A supported Python installation.
- TabPy installed and running on an accessible host.
- Required Python packages installed in the TabPy environment.
- Network access between Tableau and the TabPy service.
- Permission to configure analytics extension connections.
- A dataset suitable for statistical or predictive analysis.
Recommended Libraries
| Library |
Purpose |
| NumPy |
Numerical calculations and array operations. |
| pandas |
Data manipulation and transformation. |
| scikit-learn |
Regression, classification, clustering, and model evaluation. |
| SciPy |
Scientific calculations and statistical functions. |
| statsmodels |
Statistical modeling and inference. |
| joblib |
Saving and loading compatible Python models. |
5. Installing Python and TabPy
Step 1: Install Python
Download Python from the official website: Python Downloads.
Verify the installation in Command Prompt, PowerShell, or a terminal:
python --version
python -m pip --version
Step 2: Create a Virtual Environment
A virtual environment isolates TabPy dependencies from other Python projects.
python -m venv tabpy-env
Activate it on Windows Command Prompt:
tabpy-env\Scripts\activate
Activate it on macOS or Linux:
source tabpy-env/bin/activate
Step 3: Install TabPy and Libraries
python -m pip install --upgrade pip
python -m pip install tabpy numpy pandas scikit-learn scipy joblib
Step 4: Start TabPy
tabpy
The default TabPy service commonly uses port 9004. Check the server startup output and configuration to confirm the actual host and port.
Official guide: TabPy Installation Guide.
Step 5: Verify the Service
In a browser or an HTTP client, check the status endpoint on the configured server. For a local default setup, the URL is commonly:
http://localhost:9004/status
The endpoint can report the status of deployed functions. Do not expose an unsecured TabPy server publicly while testing.
6. Connecting Tableau to TabPy
Tableau must be configured to use the running TabPy service as an analytics extension.
Connection Procedure
- Open Tableau Desktop.
- Open the analytics extension connection settings. In many versions, use Help > Settings and Performance > Manage Analytics Extension Connection.
- Select the Tableau Python Server or TabPy option.
- Enter the server host, such as
localhost for a local installation.
- Enter the configured port, commonly
9004.
- Configure authentication and secure connection settings where required.
- Save the configuration and test a simple Python calculation.
Menu labels and configuration requirements vary by Tableau version and deployment environment. For published workbooks, the Tableau Server or Tableau Cloud administrator may need to configure the analytics extension connection separately.
Reference: Configure Tableau to Use TabPy.
7. Tableau Script Functions for Python
Tableau uses script functions to pass data and Python expressions to TabPy. Choose the function according to the expected result type.
| Function |
Expected Result |
Example Use |
SCRIPT_REAL |
Real or decimal values |
Predictions, averages, statistical scores. |
SCRIPT_INT |
Integer values |
Counts and integer classifications. |
SCRIPT_STR |
String values |
Text transformations and labels. |
SCRIPT_BOOL |
Boolean values |
True/false classifications. |
General Syntax
SCRIPT_REAL(
"
# Python expression
return [float(value) for value in _arg1]
",
SUM([Sales])
)
The example shows the general structure of a script calculation. The expression passed from Tableau is available to Python as _arg1. The returned values must be compatible with Tableau's expected output shape.
Important Concepts
- Input values: Tableau passes values from the worksheet to Python.
- Aggregation: Inputs may already be aggregated, depending on the view.
- Partitioning: Tableau can run calculations separately for different partitions.
- Addressing: Defines how table calculations traverse marks.
- Return shape: The result must be a compatible scalar or correctly sized sequence.
Official reference: Python Calculations in Tableau.
8. Advanced Analytics Use Case 1: Statistical Analysis
Python can calculate descriptive statistics such as mean, median, standard deviation, and percentiles. Tableau can display the results and let users explore differences across business categories.
Example: Calculate the Mean
SCRIPT_REAL(
"
import numpy as np
values = np.array(_arg1, dtype=float)
return [float(np.mean(values))]
",
SUM([Sales])
)
This is an illustrative calculation. Since the input is SUM([Sales]), Tableau may pass aggregated sales values rather than individual transactions. Configure the worksheet and table-calculation settings to match the intended analytical question.
Example: Calculate Standard Deviation
SCRIPT_REAL(
"
import numpy as np
values = np.array(_arg1, dtype=float)
return [float(np.std(values, ddof=0))]
",
SUM([Sales])
)
ddof=0 calculates population standard deviation. Use ddof=1 for sample standard deviation when appropriate.
Business Applications
- Measure variability in sales across regions.
- Compare performance consistency between products.
- Analyze variations in customer spending.
- Identify unusually high or low observations for investigation.
9. Advanced Analytics Use Case 2: Regression and Sales Prediction
Regression models estimate the relationship between a target variable and one or more predictor variables. For example, a retailer may estimate sales based on advertising expenditure.
Python Example
import numpy as np
from sklearn.linear_model import LinearRegression
X = np.array([[10], [20], [30], [40], [50]])
y = np.array([100, 180, 260, 330, 420])
model = LinearRegression()
model.fit(X, y)
predictions = model.predict([[60]])
print(predictions)
The sample data is artificial and demonstrates model training only.
Recommended Workflow
- Prepare historical sales and predictor data.
- Train the model in Python.
- Evaluate the model on data not used for training.
- Deploy the trained model or prediction function to TabPy.
- Pass the required predictor values from Tableau.
- Return predictions in a Tableau-compatible format.
- Visualize actual and predicted sales together.
For production, avoid retraining the model on every dashboard interaction. Train and validate the model separately, then reuse the trained model through a deployed function where appropriate.
10. Advanced Analytics Use Case 3: Customer Segmentation
Customer segmentation groups customers according to similarities in behavior, spending, purchase frequency, or other features. K-means is one common clustering algorithm.
Python Example
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
X = np.array([
[100, 2],
[120, 3],
[150, 2],
[600, 10],
[650, 11],
[700, 12]
], dtype=float)
X_scaled = StandardScaler().fit_transform(X)
model = KMeans(n_clusters=2, n_init=10, random_state=42)
labels = model.fit_predict(X_scaled)
print(labels.tolist())
The example uses artificial values for annual spending and visit frequency. Standardization helps prevent a large-scale variable from dominating distance-based clustering.
How Tableau Uses the Results
- Color customers by assigned cluster.
- Compare average spending across segments.
- Display customer counts by group.
- Filter by region, category, or customer type.
- Identify segments that may benefit from different marketing strategies.
Cluster identifiers are arbitrary labels, not rankings. Evaluate the groups to determine whether they are meaningful for the business.
11. Advanced Analytics Use Case 4: Anomaly Detection
Anomaly detection identifies observations that differ substantially from expected patterns. It can support investigation of unusual transactions, unexpected sales drops, and abnormal operational measurements.
Example: Z-Score
import numpy as np
values = np.array([100, 105, 98, 102, 110, 250], dtype=float)
mean_value = np.mean(values)
std_value = np.std(values)
if std_value == 0:
z_scores = np.zeros_like(values)
else:
z_scores = (values - mean_value) / std_value
print(z_scores.tolist())
A common exploratory approach flags observations whose absolute z-score exceeds 3. However, thresholds must be selected according to the data distribution and business context; this rule is not suitable for every dataset.
Dashboard Applications
- Highlight unusual sales transactions.
- Display operational measurements outside expected ranges.
- Show flagged records in a detailed table.
- Filter anomalies by date, region, or product.
- Help analysts investigate potential causes.
12. Advanced Analytics Use Case 5: Classification
Classification predicts a category or class rather than a continuous numerical value. Examples include predicting whether a customer may leave, whether a transaction requires review, or whether a service request belongs to a particular category.
Example: Logistic Regression
from sklearn.linear_model import LogisticRegression
import numpy as np
X = np.array([
[1, 20],
[2, 25],
[3, 40],
[4, 60],
[5, 80],
[6, 100]
], dtype=float)
y = np.array([0, 0, 0, 1, 1, 1])
model = LogisticRegression()
model.fit(X, y)
probabilities = model.predict_proba([[4, 55]])[:, 1]
print(probabilities.tolist())
This example demonstrates the mechanics of classification using artificial data. It is not a validated risk model.
Business Applications
- Customer churn analysis.
- Fraud review prioritization.
- Lead conversion analysis.
- Customer support ticket classification.
- Quality-control alerts.
Before using classification scores for business decisions, assess model quality, calibration, bias, privacy requirements, and the cost of false positives and false negatives.
13. Deploying Reusable Python Functions
TabPy supports deployed endpoints: Python functions saved on the TabPy server and made available for repeated calls. This approach helps keep complex analytical logic separate from Tableau calculated fields.
Advantages of Deployed Functions
- Reuse the same logic across workbooks.
- Centralize analytical code.
- Maintain and version functions more consistently.
- Reuse trained models instead of retraining for every request.
- Separate model development from dashboard presentation.
Step 1: Create a Python Function
def add_values(x, y):
return (x + y).tolist()
This function expects compatible array-like inputs and returns a list of summed values.
Step 2: Deploy the Function
Run the following script in the Python environment where the TabPy tools package is installed and the server is accessible:
from tabpy.tabpy_tools.client import Client
client = Client("http://localhost:9004/")
def add_values(x, y):
return (x + y).tolist()
client.deploy(
"add_values",
add_values,
"Adds two compatible arrays of numerical values.",
override=True
)
This example illustrates the deployment pattern for a local test environment. For authenticated or remote servers, configure the client with the appropriate secure endpoint and credentials. Use an authenticated, encrypted connection for production.
Step 3: Call the Deployed Function from Tableau
SCRIPT_REAL(
"
return tabpy.query('add_values', _arg1, _arg2)['response']
",
SUM([Sales]),
SUM([Profit])
)
This calculated field illustrates the endpoint-calling pattern. It adds the values Tableau passes for sales and profit, so it is a technical demonstration rather than a recommended business KPI. Verify the endpoint's input and output shape and the worksheet's calculation settings.
Official guide: Deploy and Manage TabPy Functions.
14. Using a Trained Model in TabPy
For production prediction workflows, train and evaluate a model separately, then deploy a function that uses the trained model to produce predictions.
Example Function Structure
def predict_sales(advertising_spend):
# Assume model is already trained and available
values = np.asarray(advertising_spend, dtype=float).reshape(-1, 1)
predictions = model.predict(values)
return predictions.tolist()
This is a function template. The imports, trained model, and input validation must be defined in the deployment environment before it can run.
Recommended Model Lifecycle
- Collect and validate historical data.
- Split data into training and testing sets.
- Train a suitable model in Python.
- Evaluate its accuracy and relevant business metrics.
- Deploy the model with a clearly defined input/output contract.
- Call the deployed endpoint from Tableau.
- Monitor performance and model drift.
- Retrain and redeploy when justified by new evidence.
TabPy can retain deployed model functions in its server process. Reusing an already loaded model is often more efficient than loading or training it for every request. Learn about model deployment.
15. Using TabPy with Tableau Prep
Tableau Prep can use Python scripts through TabPy in supported environments. This enables data preparation steps that apply custom Python transformations to a dataset and return a table to the flow.
Common Use Cases
- Creating custom ranking fields.
- Adding calculated scores to a dataset.
- Applying specialized data transformations.
- Enriching data with supported model outputs.
- Preparing transformed data for downstream visualization.
General Workflow
- Install Python and TabPy.
- Install the required Python libraries.
- Configure the TabPy connection in the supported Prep environment.
- Connect to a data source and create a flow.
- Add a script step and specify the script or function.
- Run the step and inspect the returned table.
- Validate data types, row counts, and results.
- Continue preparing or output the data.
Check the current product documentation for environment-specific limitations. Tableau's documented Python script-step workflow supports Tableau Prep Builder and configured Tableau Server deployments, while running flows with script steps in Tableau Cloud is not currently supported in the cited documentation. Tableau Prep Script Documentation.
16. Understanding Aggregation and Table Calculations
When Tableau sends data to TabPy, the values depend on the worksheet's level of detail and table-calculation settings. Tableau commonly aggregates data before sending it to the analytics extension.
Important Terms
- Level of detail: The granularity at which the view represents data.
- Aggregation: Combining records using functions such as SUM, AVG, or COUNT.
- Partitioning: Dividing marks into independent groups for calculation.
- Addressing: Determining how a calculation moves across marks.
- Result alignment: Ensuring returned values correspond to the correct marks.
Example
If a worksheet contains one mark per region, TabPy may receive aggregated values for each region instead of the underlying transaction-level records. A model trained on transaction-level data may therefore behave incorrectly if it expects individual transactions but receives regional totals.
Best Practices
- Decide whether the calculation requires row-level or aggregated data.
- Review the worksheet's table-calculation settings.
- Check the length and type of the returned results.
- Validate outputs using a small, known dataset.
- Test calculations when filters or dimensions change.
17. Performance Optimization with TabPy
TabPy adds communication overhead because Tableau sends requests to an external service. Complex models, large inputs, or repeated calls can affect dashboard responsiveness.
| Performance Issue |
Recommended Improvement |
| Large datasets sent to Python |
Send only required fields and use appropriate aggregation. |
| Expensive model inference |
Optimize the model and avoid unnecessary calculations. |
| Repeated model training |
Train and validate separately, then reuse a deployed model. |
| Many external-service calls |
Review partitioning and calculation design to avoid unnecessary requests. |
| Slow Python loops |
Use efficient vectorized operations where appropriate. |
| High server resource usage |
Monitor CPU, memory, concurrency, and request load. |
| Unclear bottlenecks |
Measure the Tableau workbook and TabPy service independently. |
Always test with realistic data volumes. A calculation that works quickly on a small sample may become slow when used on a large published dashboard.
18. Security and Governance
TabPy can execute Python code on the machine hosting the service. It must be protected like any other code-execution service.
- Enable authentication and secure connections as appropriate.
- Restrict access to trusted networks and authorized clients.
- Do not expose an unsecured service to the public internet.
- Keep the server and installed libraries updated.
- Review the Python code and packages used by deployed functions.
- Do not hardcode passwords, API keys, or secrets in workbook calculations.
- Limit the data sent to TabPy to what the calculation needs.
- Use appropriate access controls for sensitive information.
- Monitor service availability and deployed endpoint status.
The TabPy project warns that the default configuration may not enable authentication. Review the security documentation before using TabPy beyond a controlled local test. For Tableau Cloud analytics extensions, encrypted connections and trusted certificates are required. TabPy Security Guidance | Tableau Cloud Connection Security.
19. Common Errors and Troubleshooting
| Error |
Possible Cause |
Solution |
| Connection refused |
TabPy is not running or the host/port is incorrect. |
Start the service and verify the configured endpoint. |
| Module not found |
A required library is missing. |
Install the library in the Python environment used by TabPy. |
| Unauthorized response |
Authentication is enabled but credentials are missing or incorrect. |
Configure the client and connection with valid credentials. |
| Invalid result length |
The script returns a result with an unexpected number of values. |
Check the expected result shape and table-calculation settings. |
| Incorrect output values |
Aggregation or partitioning does not match the intended calculation. |
Review the worksheet's level of detail and calculation settings. |
| Slow dashboard |
Expensive Python operations or excessive requests. |
Optimize the code, reduce data transfer, and reuse deployed functions. |
| Endpoint not found |
The function has not been deployed or its name is incorrect. |
Check the deployed endpoint list and function name. |
| Published workbook fails |
The published environment cannot reach the analytics extension. |
Configure the server/site connection and validate network access. |
| Serialization error |
The returned Python object cannot be serialized into the expected response. |
Return supported values, such as a list of numbers or strings. |
20. Practical Project: Predictive Sales Analytics Dashboard
Project Objective: Create a Tableau dashboard that displays actual sales, Python-generated sales predictions, and regional performance analysis using TabPy.
Sample Dataset
| Order Date |
Region |
Advertising Spend |
Sales |
| 2026-01-05 |
West |
10000 |
50000 |
| 2026-01-10 |
East |
8000 |
40000 |
| 2026-01-15 |
North |
6000 |
30000 |
| 2026-01-20 |
South |
12000 |
60000 |
| 2026-01-25 |
West |
9000 |
45000 |
The sample values are illustrative and are not a validated real-world dataset.
Project Steps
- Prepare and clean the sales dataset.
- Connect the dataset to Tableau Desktop.
- Install TabPy and verify that it is running.
- Configure Tableau's analytics extension connection.
- Train and validate a regression model using Python.
- Deploy a reusable prediction endpoint to TabPy.
- Create a Tableau calculated field that calls the endpoint.
- Validate returned predictions against an independent Python calculation.
- Create an actual-versus-predicted sales chart.
- Create a regional sales comparison chart.
- Add date, region, and product filters where appropriate.
- Test dashboard performance and published connectivity.
- Document model limitations and monitor prediction quality.
Recommended Dashboard Components
- Total sales KPI.
- Predicted sales KPI.
- Actual versus predicted sales line chart.
- Regional sales bar chart.
- Advertising expenditure versus sales scatter plot.
- Filters for date and region.
- Tooltip describing the prediction and its limitations.
Expected Learning Outcomes
- Understand the complete Tableau-to-TabPy workflow.
- Configure and test an analytics extension connection.
- Use a Python script calculation and deployed endpoint.
- Display advanced analytical results in Tableau.
- Validate predictions and diagnose common errors.
- Apply performance and security best practices.
21. Difference Between TabPy and Native Tableau Analytics
| Feature |
Native Tableau |
TabPy |
| Core purpose |
Business intelligence and visual analytics. |
Extends Tableau with Python execution. |
| Typical calculations |
Aggregations, logical calculations, LOD expressions. |
Custom statistics, model inference, specialized Python functions. |
| Setup |
Usually available within Tableau. |
Requires a configured external service. |
| External libraries |
Uses Tableau's built-in calculation capabilities. |
Can use compatible Python libraries installed on the TabPy server. |
| Performance factors |
Calculation complexity and data-source performance. |
Calculation complexity, network overhead, service capacity, and data volume. |
| Maintenance |
Often simpler for standard calculations. |
Requires Python environment, package, endpoint, and service maintenance. |
Recommendation: Use native Tableau calculations for standard business logic. Use TabPy when Python provides a meaningful analytical advantage.
22. Interview Questions and Answers
Q1. What is TabPy?
Answer: TabPy is an open-source analytics extension that allows Tableau to execute Python scripts and call deployed Python functions.
Q2. What is advanced analytics?
Answer: Advanced analytics uses statistical methods, mathematical techniques, and machine learning to understand patterns, explain outcomes, and make predictions.
Q3. Which script functions does Tableau use with TabPy?
Answer: Common functions include SCRIPT_REAL, SCRIPT_INT, SCRIPT_STR, and SCRIPT_BOOL, depending on the required result type.
Q4. What is a deployed TabPy endpoint?
Answer: It is a Python function made available on the TabPy server so that Tableau or another authorized client can invoke reusable analytical logic.
Q5. Why use deployed models?
Answer: Deployed models allow trained logic to be reused, avoid unnecessary retraining, and centralize model maintenance.
Q6. Can TabPy support machine learning?
Answer: Yes. Compatible Python libraries can be used for regression, classification, clustering, anomaly detection, and other supported analytical workflows.
Q7. Why does the returned result length matter?
Answer: Tableau expects results that fit the calculation's output shape. A mismatched result can cause errors or incorrect alignment with marks.
Q8. How does aggregation affect TabPy calculations?
Answer: Tableau may send aggregated values based on the view's level of detail, so the Python code must be designed for the data it actually receives.
Q9. How can TabPy performance be improved?
Answer: Reduce unnecessary input data, optimize code, reuse trained models, limit repeated calls, and test the service under realistic workloads.
Q10. What are the security risks of TabPy?
Answer: TabPy can execute Python code on its host. It must be protected with suitable authentication, network restrictions, secure connections, and controlled deployment permissions.
Q11. Can TabPy be used with Tableau Prep?
Answer: Yes, Tableau Prep supports Python script steps through TabPy in supported environments, subject to product and deployment limitations.
Q12. What is a key difference between Tableau calculations and TabPy?
Answer: Tableau calculations handle many common BI operations, while TabPy enables Python-based functions and specialized analytical libraries.
23. Practice Exercises
- Install TabPy in a Python virtual environment.
- Configure Tableau Desktop to connect to TabPy.
- Create a calculated field that applies a simple Python transformation.
- Calculate a statistical measure using NumPy.
- Train a basic regression model in scikit-learn.
- Deploy a reusable addition function to TabPy.
- Call the deployed function from a Tableau calculated field.
- Build a customer segmentation example using clustering.
- Generate anomaly scores and display them in a worksheet.
- Investigate a result-length error and document the fix.
- Build an actual-versus-predicted sales dashboard.
- Document the security and performance requirements for deployment.
24. Quick Revision Checklist
- Understand what TabPy is and how it works.
- Know the role of Tableau, Python, and deployed endpoints.
- Install Python, TabPy, and the required libraries.
- Configure Tableau's analytics extension connection.
- Understand Tableau's Python script functions.
- Know how aggregation and partitioning affect inputs.
- Understand statistical analysis, regression, classification, and clustering.
- Know how to deploy and reuse Python functions.
- Understand model validation and prediction monitoring.
- Recognize common connection, dependency, and result-shape errors.
- Apply security controls and performance optimization.
- Test the published environment before production use.
25. Conclusion
TabPy extends Tableau by making Python-based analytics available through an external service. It supports custom calculations, statistical analysis, predictive modeling, clustering, anomaly detection, and reusable deployed functions.
To use TabPy effectively, understand the connection setup, script-function syntax, input aggregation, output alignment, model deployment, performance requirements, and security controls. Start with simple calculations, validate the returned results, and then develop more advanced analytical dashboards.
Explore Tableau Training: Explore Tableau Training
Register for a Course Demo: Register for a Tableau Course Demo
26. Official Learning Resources